home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / AppInstall / update.py < prev    next >
Encoding:
Python Source  |  2009-03-31  |  3.6 KB  |  114 lines

  1. import sys
  2. import glob
  3. import os
  4. import os.path
  5. import re
  6. import sys
  7.  
  8. from optparse import OptionParser
  9.  
  10. import gdbm
  11.  
  12. os.unsetenv("DISPLAY")
  13.  
  14. try:
  15.     import xdg.DesktopEntry
  16. except ImportError, e:
  17.     print "WARNING: can not import xdg.DesktopEntry, aborting"
  18.     sys.exit(0)
  19.  
  20. try:
  21.     from CoreMenu import *
  22. except ImportError, e:
  23.     print "Can't import AppInstall.CoreMenu, aborting"
  24.     sys.exit(0)
  25.  
  26.  
  27. def generate_mime_map(desktop_dir, cache_dir):
  28.     dicts = { 'mime':{}, 'codec':{} }
  29.  
  30.     def record_provider(de, cp, defield,dictname):
  31.     try: keys = de.get(defield, list=True)
  32.         except keyError: return
  33.     if not keys: return
  34.     dict = dicts[dictname]
  35.     for key in keys:
  36.             # gst-caps support
  37.             if dictname == 'codec' and ',' in key:
  38.                 key = key.split(",")[0]
  39.         try:
  40.                 l = dict[key]
  41.             except KeyError:
  42.                 l = []; dict[key] = l
  43.             l.append(cp)
  44.  
  45.     for fn in glob.glob(os.path.join(desktop_dir, 'desktop/*.desktop')):
  46.         try:
  47.             de = xdg.DesktopEntry.DesktopEntry(fn)
  48.         except Exception, e:
  49.             print >>sys.stderr, "bad .desktop file: %s: %s" % (fn, e)
  50.         try:
  51.             component = de.get('X-AppInstall-Section')
  52.             package = de.get('X-AppInstall-Package')
  53.         except KeyError:
  54.             continue
  55.     cp = component+"/"+package
  56.     record_provider(de, cp, 'MimeType','mime')
  57.     record_provider(de, cp, 'X-AppInstall-Codecs','codec')
  58.  
  59.     for (dictname,dict) in dicts.iteritems():
  60.     g = gdbm.open(os.path.join(cache_dir,
  61.             "gai-"+dictname+"-map.gdbm"),'nfu')
  62.     for (key,l) in dict.iteritems():
  63.         g[key] = ' '.join(l)
  64.     g.sync()
  65.     g.close()
  66.     os.chmod(os.path.join(cache_dir, "gai-"+dictname+"-map.gdbm"), 0644)
  67.  
  68. def generate_menu_cache(desktop_dir, cache_dir):
  69.     # the regular menu cache
  70.     menu = CoreApplicationMenu(desktop_dir)
  71.     menu.createMenuCache(cache_dir)
  72.     # now the codec/mime menu_cache
  73.     codec_pickle = {}
  74.     mime_pickle = {}
  75.     for cat in menu.pickle:
  76.         for item in menu.pickle[cat]:
  77.             if item.codecs != ['']:
  78.                 if not codec_pickle.has_key(cat):
  79.                     codec_pickle[cat] = []
  80.                 codec_pickle[cat].append(item)
  81.             if item.mime != []:
  82.                 if not mime_pickle.has_key(cat):
  83.                     mime_pickle[cat] = []
  84.                 mime_pickle[cat].append(item)
  85.     pickle.dump(mime_pickle, open('%s/mime_menu.p' % cache_dir,'w'), 2)
  86.     os.chmod('%s/mime_menu.p' % cache_dir, 0644)
  87.     pickle.dump(codec_pickle, open('%s/codec_menu.p' % cache_dir,'w'), 2)
  88.     os.chmod('%s/codec_menu.p' % cache_dir, 0644)
  89.  
  90. def main():
  91.      parser = OptionParser()
  92.       parser.add_option ("-d", "--desktop-dir", action="store",
  93.                        dest="desktop_dir", 
  94.                         default="/usr/share/app-install",
  95.                        help="Directory that contains the desktop files "
  96.                             "of the applications")
  97.       parser.add_option ("-c", "--cache-dir", action="store",
  98.                        dest="cache_dir", 
  99.                         default="/var/cache/app-install",
  100.                        help="Directory where the data should be cached in")
  101.     (options, args) = parser.parse_args()
  102.     for path in (options.desktop_dir, options.cache_dir):
  103.         if not os.path.isdir(path):
  104.             print "%s is not a valid directory" % path
  105.             sys.exit(1)
  106.     print "Caching application data..."
  107.     try:
  108.         generate_menu_cache(options.desktop_dir, options.cache_dir)
  109.         print "Generating mime/codec maps..."
  110.         generate_mime_map(options.desktop_dir, options.cache_dir)
  111.     except IOError:
  112.         print "You must run this program with administrator privileges."\
  113.                 "(eg. sudo update-app-instal)"
  114.